﻿using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;
using System;

namespace Studio7i.Persistencia.ADO
{
    public class SalaDAO : ISalaDAO
    {
        // Dependencias
        ILocalDAO localDAO = new LocalDAO();

        // Métodos CRUD
        public Sala Crear(Sala salaACrear)
        {
            string _Sentencia = @"INSERT INTO sala (codigo, nombre, caracteristicas, capacidad, local, comentarios) 
                VALUES(@codigo, @nombre, @caracteristicas, @capacidad, @local, @comentarios)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", salaACrear.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", salaACrear.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@capacidad", salaACrear.Capacidad));
                    _Comando.Parameters.Add(new SqlParameter("@local", salaACrear.Local.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@comentarios", (salaACrear.Comentarios == null) ? DBNull.Value.ToString() : salaACrear.Comentarios));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Sala Obtener(int codigo)
        {
            string _Sentencia = @"SELECT codigo, nombre, caracteristicas, capacidad, local, comentarios 
                FROM sala WHERE codigo=@codigo";
            Sala salaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            salaCreada = new Sala();
                            salaCreada.Codigo = (int)_Resultado["codigo"];
                            salaCreada.Nombre = (string)_Resultado["nombre"];
                            salaCreada.Caracteristicas = (string)_Resultado["caracteristicas"];
                            salaCreada.Capacidad = (int)_Resultado["capacidad"];
                            salaCreada.Local = localDAO.Obtener((int)_Resultado["local"]);
                            salaCreada.Comentarios = (string)_Resultado["comentarios"];
                        }
                    }
                }
            }
            return salaCreada;
        }
        public Sala Modificar(Sala salaAModificar)
        {
            string _Sentencia = @"UPDATE sala SET nombre=@nombre, caracteristicas=@caracteristicas, capacidad=@capacidad, local=@local, comentarios=@comentarios 
                WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", salaAModificar.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", salaAModificar.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@capacidad", salaAModificar.Capacidad)); 
                    _Comando.Parameters.Add(new SqlParameter("@local", salaAModificar.Local.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@comentarios", salaAModificar.Comentarios)); 
                    _Comando.Parameters.Add(new SqlParameter("@codigo", salaAModificar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(salaAModificar.Codigo);
        }
        public void Eliminar(Sala salaAEliminar)
        {
            string _Sentencia = "DELETE FROM sala WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", salaAEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Sala> ListarTodos()
        {
            string _Sentencia = @"SELECT codigo, nombre, caracteristicas, capacidad, local, comentarios FROM sala";
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            salaEncontrada.Codigo = (int)_Resultado["codigo"];
                            salaEncontrada.Nombre = (string)_Resultado["nombre"];
                            salaEncontrada.Caracteristicas = (string)_Resultado["caracteristicas"];
                            salaEncontrada.Capacidad = (int)_Resultado["capacidad"];
                            salaEncontrada.Local = localDAO.Obtener((int)_Resultado["local"]);
                            salaEncontrada.Comentarios = (string)_Resultado["comentarios"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }
        public ICollection<Sala> ListarXBusqueda(int? codigo, string nombre, string caracteristicas, int? capacidad, Local local, string comentarios)
        {
            string _Sentencia = @"SELECT codigo, nombre, caracteristicas, capacidad, local, comentarios 
                FROM sala WHERE 1=1";
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND codigo=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (nombre != null)
                    {
                        _Sentencia = _Sentencia + " AND nombre LIKE '%'+@nombre+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    }
                    if (caracteristicas != null)
                    {
                        _Sentencia = _Sentencia + " AND caracteristicas LIKE '%'+@caracteristicas+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@caracteristicas", caracteristicas));
                    }
                    if (capacidad != null)
                    {
                        _Sentencia = _Sentencia + " AND capacidad=@capacidad";
                        _Comando.Parameters.Add(new SqlParameter("@capacidad", capacidad));
                    }
                    if (local != null)
                    {
                        _Sentencia = _Sentencia + " AND local=@local";
                        _Comando.Parameters.Add(new SqlParameter("@local", local.Codigo));
                    }
                    if (comentarios != null)
                    {
                        _Sentencia = _Sentencia + " AND comentarios LIKE '%'+@comentarios+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@comentarios", comentarios));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            salaEncontrada.Codigo = (int)_Resultado["codigo"];
                            salaEncontrada.Nombre = (string)_Resultado["nombre"];
                            salaEncontrada.Caracteristicas = (string)_Resultado["caracteristicas"];
                            salaEncontrada.Capacidad = (int)_Resultado["capacidad"];
                            salaEncontrada.Local = localDAO.Obtener((int)_Resultado["local"]);
                            salaEncontrada.Comentarios = (string)_Resultado["comentarios"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(codigo) FROM sala";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}